/** 
 *  @file
 *  @brief   实体单元本构矩阵解析
 *  @author  王欢
 *  @date    2024.04.18
 *  @version v1.0
 *  @par Copyright(c):  ShenGong  Simulation corporation
 */

#pragma once
#include "Utility/Algebra/Matrix.h"
#include "DataStructure/Common/Id.h"
#include "DataStructure/Common/Real.h"
#include "DBManager/DBServiceFactory.h"
#include "../Common/ElementCalculatorExport.h"

SG_FEMSOLVER_ELEMENT_NAMESPACE_OPEN

/** @brief 计算实体单元的材料弹性矩阵
 * 
 */
class ElementCalculator_DECLSPEC SolidMaterialParser
{
public:
    /**
     * @brief    计算单元的材料坐标系变换矩阵：单元坐标系到材料坐标系
     * 
     * @param    [in] mCId 材料坐标系 Id
     * @param    [in] T 单元坐标系变换矩阵
     * @param    [in] TS 基于单元的应力应变坐标系（即 mCId = -2）变换矩阵
     * @param    [out] TMat 单元的材料坐标系变换矩阵：单元坐标系到材料坐标系
     * @author   Du Weixing
     * @date     2025.03.07
     */
    static void ComputeMaterialCoordTrans
    (
    const SG::DataStructure::Common::Id mCId,
    const SG::Algebra::Matrixd&         T,
    const SG::Algebra::Matrixd&         TS,
    _OUT SG::Algebra::Matrixd&          TMat
    );

    /**
     * @brief    计算单元坐标系下的弹性矩阵
     * 
     * @param    [in] dbServiceFactory 数据库
     * @param    [in] mId 材料 Id
     * @param    [in] TMat 单元的材料坐标系变换矩阵：单元坐标系到材料坐标系
     * @param    [out] D 单元坐标系下的弹性矩阵
     * @param    [out] rho 材料密度
     */
    static void ComputeElasticMatrix
    (
    const SG::DBManager::DBServiceFactorySP dbServiceFactory,
    const SG::DataStructure::Common::Id     mId,
    const SG::Algebra::Matrixd&             TMat,
    _OUT SG::Algebra::Matrixd&              D,
    _OUT SG::DataStructure::Common::Real&   rho
    );
};

SG_FEMSOLVER_ELEMENT_NAMESPACE_CLOSE